package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	a := make([]int, 0, 100) // 存储 100 个随机数，长度从 0 开始，减少判断是否存在的查找时间
	b := make([]int, 0, 100) // 记录随机数出现的次数

	r := rand.New(rand.NewSource(time.Now().UnixNano()))

	// 生成 100 个随机数并记录每个随机数出现的次数
	for i := 0; i < 100; i++ {
		v := r.Intn(201) - 100 // 随机数范围 [-100, 100]
		// fmt.Println(v)
		exists := false

		// 判断生成的随机数是否已存在
		for j := 0; j < len(a); j++ {
			if v == a[j] {
				// 随机数已存在，只增加出现次数
				b[j] += 1
				exists = true
				break
			}
		}

		if !exists {
			// 随机数不存在，追加，出现次数初始为 1
			a = append(a, v)
			b = append(b, 1)
		}
	}
	fmt.Println("排序前:")
	for i := 0; i < len(a); i++ {
		fmt.Printf("%3d(%d)", a[i], b[i])
		if (i+1)%10 == 0 {
			fmt.Println()
		} else {
			fmt.Printf(" ")
		}
	}
	fmt.Printf("\n\n")

	// 降序排序
	for i := 0; i < len(a)-1; i++ {
		for j := 0; j < len(a)-1-i; j++ {
			if a[j] > a[j+1] {
				// 值和次数同时移动
				a[j], a[j+1] = a[j+1], a[j]
				b[j], b[j+1] = b[j+1], b[j]
			}
		}
	}

	fmt.Println("排序后:")
	for i := 0; i < len(a); i++ {
		fmt.Printf("%3d(%d)", a[i], b[i])
		if (i+1)%10 == 0 {
			fmt.Println()
		} else {
			fmt.Printf(" ")
		}
	}
	fmt.Println()
}
